// 错误处理
// 类型：可恢复（文件未找到），不可恢复错误（索引超出范围）
// rust不像js有错误处理机制
// 可恢复错误Result<T,E>，不可恢复panic!宏（程序立即终止）
// 不可恢复的程序执行步骤
// 1.程序打印一个错误信息
// 2.展开（unwind）、清理调用栈（stack）
// 3.退出程序
// 不可恢复发生默认情况下程序展开调用栈，rust沿着调用栈往回走，清理每个遇到的函数中的数据（展开）
// 情况2.立即终止调用栈，不进行清理直接停止程序，内存需要os进行清理（终止）
// 把不可恢复的错误设置从展开改为中止cargo.toml中适当的profile部分设置：panic="abort"
// 为了得到错误回溯信息（调用栈）可以在命令中加上 SET RUST_BACKTRACE=1 cargo run（window）且启用调试符号（不带 --release）

// Result<T,E>  T:是成功回调E是错误回调数据

// unwarp:match的一个快捷表达式
// expect:match的一个快捷方法

// 传播错误：将函数出处理错误，将错误返回非调用者（类似js的try catch）
// ?运算符相当于match（类似js的可选链）与from的关系，并且只能用于返回Result的函数
// main函数可以返回()和Result类型

// 何时使用panic 

use std::fs::File;
use std::io;
use std::io::Read;

fn textCatchError () -> Result<String, io::Error> {
    let f = File::open("text.txt");
    match f {
        Ok(file) => {
            return Ok(String::from("value"));
        },
        Err(error) => {
            // panic!("错了{:?}", error);
            return Err(error);
        }
    }
}

fn main() {
    println!("hello world"); 
    // panic!("错误了不可恢复"); // 程序恐慌不可恢复
    let f = File::open("text.txt");
    let ff = File::open("text.txt");
    match f {
        Ok(file) => {
            println!("打开成功");
            file;
        },
        Err(error) => {
            // panic!("错了{:?}", error);
            error;
        }
    }
    let f1 = File::open("test.txt").unwrap();
    let f2 = File::open("test.txt").expect("无法打开文件");
    let res = textCatchError();
}
